/*
 *Manuel Zumbado Corrales   
 * Este programa permite recibir ciertos comandos desde serial para ingresar usuarios a un archivo 'UsuariosDB.txt'.
 */

#include <SD.h>


const int chipSelect = 4;                                     //Pin que corresponde al uso del almacenamiento SD.
char comandoSerialRecibido[50];                               //Variable global que contiene el comando recibido por Serial.
int posicionString=-1;                                        //Contador de posicion para el mensaje recibido
char usuariosActuales[100];                                   //Variable global donde se cargan los usuarios atuales almacenados en la tarjeta SD

void setup()
{
  Serial.begin(9600);                                        //Se inicializa el puerto serial.
  pinMode(10, OUTPUT);                                       //Requisito para el funcionamiento del almacenamiento sd.   
  if (!SD.begin(chipSelect)) {                              //Verifica que el dispositivo de almacenamiento este listo.
    return;
  }
  cargarUsuarios();
}

void loop()
{
  if(Serial.available() > 0){                           //Si existen datos por leer llama el metodo encargado de leerlos.
    leeDatosSerie();
  }
}


void cargarUsuarios(){
  
  File dataFile = SD.open("USUARI~1.TXT");                 //Se abre el archivo de texto


  if (dataFile) {                                         //Si el archivo existe, se cargan los nombres de los ususarios
    char caracter;
    boolean esNombre=true;
    int posicion=0;
    while (dataFile.available()) {
      caracter=dataFile.read();
      if(caracter==','&& esNombre){
        usuariosActuales[posicion]=caracter;
        esNombre=false ;
        posicion++;
      }
      if(esNombre){
        usuariosActuales[posicion]=caracter;
        posicion++;
      }
      if (caracter=='\n')
      {
        esNombre=true;
      }
    }
    usuariosActuales[posicion-1]='\0';                    //Se termina el Char Array.
    dataFile.close();                                     //Se cierra el archivo.
  }
}







void leeDatosSerie(){

  while (Serial.available() > 0){                      //Mientras existan datos por leer
    int byteEntrada = Serial.read();                   //Se lee el siguiente byte
    posicionString++;
    if(byteEntrada=='\n'){                            //Si no hay mas por leer
      comandoSerialRecibido[posicionString] = 0;      //Se termina el Char Array
      interpretarComando();                           //Se llama al metodo encargado de interpretar los comandos
      posicionString=-1;
    }
    else{                                             //Si no es el final del mensaje, se agrega el byte recibido al Array
      comandoSerialRecibido[posicionString] = byteEntrada; 
    }
  }
}


//Metodo encargado de interpretar los comandos recibidos
void interpretarComando(){

  int posicion=2;                                    //Se establecen 2 variables, una lleva el conteo de la posicion del Array y otra que almacena el nombre de usuario
  String usuario="";
  int comando=comandoSerialRecibido[0]-'0';          //Se almacena el comando a ejecutar, 1:logear usuario, 2:ingresar nuevo.

  while(comandoSerialRecibido[posicion]!=','){
    usuario+=comandoSerialRecibido[posicion];
    posicion++;
  }
  char *usuarioRecibido = &comandoSerialRecibido[2];
  if(comando==1){                                  //Si el comando es insertar nuevo usuario
    if(!verificaUsuario(usuario)){                   //Si el usuario es nuevo, se inserta en el archivo de texto
      if(ingresarNuevoUsuario(usuarioRecibido)){
        Serial.println("Creado,1,0");
      }
    }
    else{
      Serial.println("Creado,0,0"); 
    }
  }
  else if(comando==2){
    String respuesta="Logueado,";
    respuesta.concat(loguearUsuario(usuarioRecibido));
    Serial.println(respuesta);
  }
}

boolean verificaUsuario(String usuario){        //Metodo encargado de verificar si un usuario ya esta registrado
  int contador=0;
  String a= String(usuariosActuales);
  if(a.indexOf(usuario) >=0){
    return true;
  }
  else{
    return false;
  }
}

boolean ingresarNuevoUsuario(String lineaUsuario){   //Metodo encargado de ingresar ususario a la base de datos
  File dataFile = SD.open("USUARI~1.TXT", FILE_WRITE);
  if (dataFile) {
    dataFile.println(lineaUsuario);
    dataFile.close();
    cargarUsuarios();
    return true;
  }
  else{
    return false;
  }
}

String loguearUsuario(String userAndPassword){
  String tipoUsuario="0,0";
  userAndPassword.concat(",");
  File dataFile = SD.open("USUARI~1.TXT");                 //Se abre el archivo de texto
  if (dataFile) {                                         //Si el archivo existe, se cargan los nombres de los ususarios
    String linea="";
    char caracter;

    while (dataFile.available()) {
      caracter=dataFile.read();
      if (caracter!='\n')
      {
        linea+=caracter;
      }
      else{
        linea+='\n';
        if(linea.indexOf(userAndPassword) >=0){
          tipoUsuario="1,";
          tipoUsuario.concat(linea.charAt(linea.lastIndexOf(',')+1)); 
        }
        linea="";
      }
    }
    dataFile.close();                                     //Se cierra el archivo.
  }  
  return tipoUsuario; 
}



